From 0e3614cf613d2f652e72066cbfde66f0e77b7842 Mon Sep 17 00:00:00 2001 From: Arthur Silva Sens Date: Sat, 30 Sep 2023 13:22:03 +0200 Subject: [PATCH] Enable depguard linter against github.com/pkg/errors (#5930) * Enable depguard linter against github.com/pkg/errors Signed-off-by: Arthur Silva Sens * Replace errors in pkg/{admission,alertmanager} Signed-off-by: Arthur Silva Sens --------- Signed-off-by: Arthur Silva Sens --- .golangci.yml | 11 ++ pkg/admission/jsonpatch.go | 4 +- pkg/alertmanager/amcfg.go | 108 +++++++++--------- pkg/alertmanager/operator.go | 96 ++++++++-------- pkg/alertmanager/statefulset.go | 11 +- .../validation/v1alpha1/validation.go | 69 ++++++----- .../validation/v1beta1/validation.go | 69 ++++++----- 7 files changed, 187 insertions(+), 181 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 5825081cd..3e15ff03b 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -5,6 +5,7 @@ linters: enable: - revive - gci + - depguard issues: exclude-rules: @@ -24,3 +25,13 @@ linters-settings: - standard - default - prefix(github.com/prometheus-operator/prometheus-operator) + depguard: + rules: + forbid-pkg-errors: + files: + - "**/admission/*.go" + - "**/alertmanager/*.go" + - "**/alertmanager/**/*.go" + deny: + - pkg: "github.com/pkg/errors" + dsc: Should be replaced with standard lib errors or fmt.Errorf \ No newline at end of file diff --git a/pkg/admission/jsonpatch.go b/pkg/admission/jsonpatch.go index b1611ed0a..79500e2cf 100644 --- a/pkg/admission/jsonpatch.go +++ b/pkg/admission/jsonpatch.go @@ -17,14 +17,12 @@ package admission import ( "encoding/json" "fmt" - - "github.com/pkg/errors" ) func generatePatchesForNonStringLabelsAnnotations(content []byte) ([]string, error) { groups := &RuleGroups{} if err := json.Unmarshal(content, groups); err != nil { - return nil, errors.Wrap(err, "cannot unmarshal RuleGroups") + return nil, fmt.Errorf("cannot unmarshal RuleGroups: %w", err) } patches := new([]string) diff --git a/pkg/alertmanager/amcfg.go b/pkg/alertmanager/amcfg.go index 5cf9fe66b..9cac35505 100644 --- a/pkg/alertmanager/amcfg.go +++ b/pkg/alertmanager/amcfg.go @@ -17,6 +17,7 @@ package alertmanager import ( "context" "crypto/tls" + "errors" "fmt" "net" "net/url" @@ -28,7 +29,6 @@ import ( "github.com/blang/semver/v4" "github.com/go-kit/log" "github.com/go-kit/log/level" - "github.com/pkg/errors" "github.com/prometheus/alertmanager/config" "github.com/prometheus/alertmanager/timeinterval" "github.com/prometheus/common/model" @@ -63,7 +63,7 @@ func alertmanagerConfigFromBytes(b []byte) (*alertmanagerConfig, error) { } if err := checkAlertmanagerConfigRootRoute(cfg.Route); err != nil { - return nil, errors.Wrap(err, "check AlertmanagerConfig root route failed") + return nil, fmt.Errorf("check AlertmanagerConfig root route failed: %w", err) } return cfg, nil @@ -326,7 +326,7 @@ func (cb *configBuilder) addAlertmanagerConfigs(ctx context.Context, amConfigs m for _, receiver := range amConfigs[amConfigIdentifier].Spec.Receivers { receivers, err := cb.convertReceiver(ctx, &receiver, crKey) if err != nil { - return errors.Wrapf(err, "AlertmanagerConfig %s", crKey.String()) + return fmt.Errorf("AlertmanagerConfig %s: %w", crKey.String(), err) } cb.cfg.Receivers = append(cb.cfg.Receivers, receivers) } @@ -334,7 +334,7 @@ func (cb *configBuilder) addAlertmanagerConfigs(ctx context.Context, amConfigs m for _, muteTimeInterval := range amConfigs[amConfigIdentifier].Spec.MuteTimeIntervals { mti, err := convertMuteTimeInterval(&muteTimeInterval, crKey) if err != nil { - return errors.Wrapf(err, "AlertmanagerConfig %s", crKey.String()) + return fmt.Errorf("AlertmanagerConfig %s: %w", crKey.String(), err) } cb.cfg.MuteTimeIntervals = append(cb.cfg.MuteTimeIntervals, mti) } @@ -352,12 +352,12 @@ func (cb *configBuilder) addAlertmanagerConfigs(ctx context.Context, amConfigs m func (cb *configBuilder) getValidURLFromSecret(ctx context.Context, namespace string, selector v1.SecretKeySelector) (string, error) { url, err := cb.store.GetSecretKey(ctx, namespace, selector) if err != nil { - return "", errors.Wrap(err, "failed to get URL") + return "", fmt.Errorf("failed to get URL: %w", err) } url = strings.TrimSpace(url) if _, err := validation.ValidateURL(url); err != nil { - return url, errors.Wrapf(err, "invalid URL %q in key %q from secret %q", url, selector.Key, selector.Name) + return url, fmt.Errorf("invalid URL %q in key %q from secret %q: %w", url, selector.Key, selector.Name, err) } return url, nil } @@ -371,14 +371,14 @@ func (cb *configBuilder) convertGlobalConfig(ctx context.Context, in *monitoring if in.SMTPConfig != nil { if err := cb.convertSMTPConfig(ctx, out, *in.SMTPConfig, crKey); err != nil { - return nil, errors.Wrap(err, "invalid global smtpConfig") + return nil, fmt.Errorf("invalid global smtpConfig: %w", err) } } if in.HTTPConfig != nil { httpConfig, err := cb.convertHTTPConfigForV1(ctx, *in.HTTPConfig, crKey) if err != nil { - return nil, errors.Wrap(err, "invalid global httpConfig") + return nil, fmt.Errorf("invalid global httpConfig: %w", err) } out.HTTPConfig = httpConfig } @@ -386,7 +386,7 @@ func (cb *configBuilder) convertGlobalConfig(ctx context.Context, in *monitoring if in.ResolveTimeout != "" { timeout, err := model.ParseDuration(string(in.ResolveTimeout)) if err != nil { - return nil, errors.Wrap(err, "parse resolve timeout") + return nil, fmt.Errorf("parse resolve timeout: %w", err) } out.ResolveTimeout = &timeout } @@ -394,11 +394,11 @@ func (cb *configBuilder) convertGlobalConfig(ctx context.Context, in *monitoring if in.SlackAPIURL != nil { slackAPIURL, err := cb.store.GetSecretKey(ctx, crKey.Namespace, *in.SlackAPIURL) if err != nil { - return nil, errors.Wrap(err, "failed to get Slack API URL") + return nil, fmt.Errorf("failed to get Slack API URL: %w", err) } u, err := url.Parse(slackAPIURL) if err != nil { - return nil, errors.Wrap(err, "parse slack API URL") + return nil, fmt.Errorf("parse slack API URL: %w", err) } out.SlackAPIURL = &config.URL{URL: u} } @@ -406,11 +406,11 @@ func (cb *configBuilder) convertGlobalConfig(ctx context.Context, in *monitoring if in.OpsGenieAPIURL != nil { opsgenieAPIURL, err := cb.store.GetSecretKey(ctx, crKey.Namespace, *in.OpsGenieAPIURL) if err != nil { - return nil, errors.Wrap(err, "failed to get OpsGenie API URL") + return nil, fmt.Errorf("failed to get OpsGenie API URL: %w", err) } u, err := url.Parse(opsgenieAPIURL) if err != nil { - return nil, errors.Wrap(err, "parse OpsGenie API URL") + return nil, fmt.Errorf("parse OpsGenie API URL: %w", err) } out.OpsGenieAPIURL = &config.URL{URL: u} } @@ -418,7 +418,7 @@ func (cb *configBuilder) convertGlobalConfig(ctx context.Context, in *monitoring if in.OpsGenieAPIKey != nil { opsGenieAPIKey, err := cb.store.GetSecretKey(ctx, crKey.Namespace, *in.OpsGenieAPIKey) if err != nil { - return nil, errors.Wrap(err, "failed to get OpsGenie API KEY") + return nil, fmt.Errorf("failed to get OpsGenie API KEY: %w", err) } out.OpsGenieAPIKey = opsGenieAPIKey } @@ -426,7 +426,7 @@ func (cb *configBuilder) convertGlobalConfig(ctx context.Context, in *monitoring if in.PagerdutyURL != nil { u, err := url.Parse(*in.PagerdutyURL) if err != nil { - return nil, errors.Wrap(err, "parse Pagerduty URL") + return nil, fmt.Errorf("parse Pagerduty URL: %w", err) } out.PagerdutyURL = &config.URL{URL: u} } @@ -513,7 +513,7 @@ func (cb *configBuilder) convertReceiver(ctx context.Context, in *monitoringv1al for i := range in.PagerDutyConfigs { receiver, err := cb.convertPagerdutyConfig(ctx, in.PagerDutyConfigs[i], crKey) if err != nil { - return nil, errors.Wrapf(err, "PagerDutyConfig[%d]", i) + return nil, fmt.Errorf("PagerDutyConfig[%d]: %w", i, err) } pagerdutyConfigs[i] = receiver } @@ -525,7 +525,7 @@ func (cb *configBuilder) convertReceiver(ctx context.Context, in *monitoringv1al for i := range in.DiscordConfigs { receiver, err := cb.convertDiscordConfig(ctx, in.DiscordConfigs[i], crKey) if err != nil { - return nil, errors.Wrapf(err, "DiscordConfig[%d]", i) + return nil, fmt.Errorf("DiscordConfig[%d]: %w", i, err) } discordConfigs[i] = receiver } @@ -537,7 +537,7 @@ func (cb *configBuilder) convertReceiver(ctx context.Context, in *monitoringv1al for i := range in.SlackConfigs { receiver, err := cb.convertSlackConfig(ctx, in.SlackConfigs[i], crKey) if err != nil { - return nil, errors.Wrapf(err, "SlackConfig[%d]", i) + return nil, fmt.Errorf("SlackConfig[%d]: %w", i, err) } slackConfigs[i] = receiver } @@ -549,7 +549,7 @@ func (cb *configBuilder) convertReceiver(ctx context.Context, in *monitoringv1al for i := range in.WebhookConfigs { receiver, err := cb.convertWebhookConfig(ctx, in.WebhookConfigs[i], crKey) if err != nil { - return nil, errors.Wrapf(err, "WebhookConfig[%d]", i) + return nil, fmt.Errorf("WebhookConfig[%d]: %w", i, err) } webhookConfigs[i] = receiver } @@ -561,7 +561,7 @@ func (cb *configBuilder) convertReceiver(ctx context.Context, in *monitoringv1al for i := range in.OpsGenieConfigs { receiver, err := cb.convertOpsgenieConfig(ctx, in.OpsGenieConfigs[i], crKey) if err != nil { - return nil, errors.Wrapf(err, "OpsGenieConfigs[%d]", i) + return nil, fmt.Errorf("OpsGenieConfigs[%d]: %w", i, err) } opsgenieConfigs[i] = receiver } @@ -573,7 +573,7 @@ func (cb *configBuilder) convertReceiver(ctx context.Context, in *monitoringv1al for i := range in.WeChatConfigs { receiver, err := cb.convertWeChatConfig(ctx, in.WeChatConfigs[i], crKey) if err != nil { - return nil, errors.Wrapf(err, "WeChatConfig[%d]", i) + return nil, fmt.Errorf("WeChatConfig[%d]: %w", i, err) } weChatConfigs[i] = receiver } @@ -585,7 +585,7 @@ func (cb *configBuilder) convertReceiver(ctx context.Context, in *monitoringv1al for i := range in.EmailConfigs { receiver, err := cb.convertEmailConfig(ctx, in.EmailConfigs[i], crKey) if err != nil { - return nil, errors.Wrapf(err, "EmailConfig[%d]", i) + return nil, fmt.Errorf("EmailConfig[%d]: %w", i, err) } emailConfigs[i] = receiver } @@ -597,7 +597,7 @@ func (cb *configBuilder) convertReceiver(ctx context.Context, in *monitoringv1al for i := range in.VictorOpsConfigs { receiver, err := cb.convertVictorOpsConfig(ctx, in.VictorOpsConfigs[i], crKey) if err != nil { - return nil, errors.Wrapf(err, "VictorOpsConfig[%d]", i) + return nil, fmt.Errorf("VictorOpsConfig[%d]: %w", i, err) } victorOpsConfigs[i] = receiver } @@ -609,7 +609,7 @@ func (cb *configBuilder) convertReceiver(ctx context.Context, in *monitoringv1al for i := range in.PushoverConfigs { receiver, err := cb.convertPushoverConfig(ctx, in.PushoverConfigs[i], crKey) if err != nil { - return nil, errors.Wrapf(err, "PushoverConfig[%d]", i) + return nil, fmt.Errorf("PushoverConfig[%d]: %w", i, err) } pushoverConfigs[i] = receiver } @@ -621,7 +621,7 @@ func (cb *configBuilder) convertReceiver(ctx context.Context, in *monitoringv1al for i := range in.SNSConfigs { receiver, err := cb.convertSnsConfig(ctx, in.SNSConfigs[i], crKey) if err != nil { - return nil, errors.Wrapf(err, "SNSConfig[%d]", i) + return nil, fmt.Errorf("SNSConfig[%d]: %w", i, err) } snsConfigs[i] = receiver } @@ -633,7 +633,7 @@ func (cb *configBuilder) convertReceiver(ctx context.Context, in *monitoringv1al for i := range in.TelegramConfigs { receiver, err := cb.convertTelegramConfig(ctx, in.TelegramConfigs[i], crKey) if err != nil { - return nil, errors.Wrapf(err, "TelegramConfig[%d]", i) + return nil, fmt.Errorf("TelegramConfig[%d]: %w", i, err) } telegramConfigs[i] = receiver } @@ -645,7 +645,7 @@ func (cb *configBuilder) convertReceiver(ctx context.Context, in *monitoringv1al for i := range in.WebexConfigs { receiver, err := cb.convertWebexConfig(ctx, in.WebexConfigs[i], crKey) if err != nil { - return nil, errors.Wrapf(err, "WebexConfig[%d]", i) + return nil, fmt.Errorf("WebexConfig[%d]: %w", i, err) } webexConfigs[i] = receiver } @@ -832,7 +832,7 @@ func (cb *configBuilder) convertPagerdutyConfig(ctx context.Context, in monitori if in.RoutingKey != nil { routingKey, err := cb.store.GetSecretKey(ctx, crKey.Namespace, *in.RoutingKey) if err != nil { - return nil, errors.Wrap(err, "failed to get routing key") + return nil, fmt.Errorf("failed to get routing key: %w", err) } out.RoutingKey = routingKey } @@ -840,7 +840,7 @@ func (cb *configBuilder) convertPagerdutyConfig(ctx context.Context, in monitori if in.ServiceKey != nil { serviceKey, err := cb.store.GetSecretKey(ctx, crKey.Namespace, *in.ServiceKey) if err != nil { - return nil, errors.Wrap(err, "failed to get service key") + return nil, fmt.Errorf("failed to get service key: %w", err) } out.ServiceKey = serviceKey } @@ -908,7 +908,7 @@ func (cb *configBuilder) convertOpsgenieConfig(ctx context.Context, in monitorin if in.APIKey != nil { apiKey, err := cb.store.GetSecretKey(ctx, crKey.Namespace, *in.APIKey) if err != nil { - return nil, errors.Wrap(err, "failed to get API key") + return nil, fmt.Errorf("failed to get API key: %w", err) } out.APIKey = apiKey } @@ -964,7 +964,7 @@ func (cb *configBuilder) convertWeChatConfig(ctx context.Context, in monitoringv if in.APISecret != nil { apiSecret, err := cb.store.GetSecretKey(ctx, crKey.Namespace, *in.APISecret) if err != nil { - return nil, errors.Wrap(err, "failed to get API secret") + return nil, fmt.Errorf("failed to get API secret: %w", err) } out.APISecret = apiSecret } @@ -1025,7 +1025,7 @@ func (cb *configBuilder) convertEmailConfig(ctx context.Context, in monitoringv1 if in.AuthPassword != nil { authPassword, err := cb.store.GetSecretKey(ctx, crKey.Namespace, *in.AuthPassword) if err != nil { - return nil, errors.Wrap(err, "failed to get auth password") + return nil, fmt.Errorf("failed to get auth password: %w", err) } out.AuthPassword = authPassword } @@ -1033,7 +1033,7 @@ func (cb *configBuilder) convertEmailConfig(ctx context.Context, in monitoringv1 if in.AuthSecret != nil { authSecret, err := cb.store.GetSecretKey(ctx, crKey.Namespace, *in.AuthSecret) if err != nil { - return nil, errors.Wrap(err, "failed to get auth secret") + return nil, fmt.Errorf("failed to get auth secret: %w", err) } out.AuthSecret = authSecret } @@ -1067,7 +1067,7 @@ func (cb *configBuilder) convertVictorOpsConfig(ctx context.Context, in monitori if in.APIKey != nil { apiKey, err := cb.store.GetSecretKey(ctx, crKey.Namespace, *in.APIKey) if err != nil { - return nil, errors.Wrap(err, "failed to get API key") + return nil, fmt.Errorf("failed to get API key: %w", err) } out.APIKey = apiKey } @@ -1087,7 +1087,7 @@ func (cb *configBuilder) convertVictorOpsConfig(ctx context.Context, in monitori customFields = make(map[string]string, l) for _, d := range in.CustomFields { if _, ok := reservedFields[d.Key]; ok { - return nil, errors.Errorf("VictorOps config contains custom field %s which cannot be used as it conflicts with the fixed/static fields", d.Key) + return nil, fmt.Errorf("VictorOps config contains custom field %s which cannot be used as it conflicts with the fixed/static fields", d.Key) } customFields[d.Key] = d.Value } @@ -1118,10 +1118,10 @@ func (cb *configBuilder) convertPushoverConfig(ctx context.Context, in monitorin { userKey, err := cb.store.GetSecretKey(ctx, crKey.Namespace, *in.UserKey) if err != nil { - return nil, errors.Wrap(err, "failed to get user key") + return nil, fmt.Errorf("failed to get user key: %w", err) } if userKey == "" { - return nil, errors.Errorf("mandatory field %q is empty", "userKey") + return nil, fmt.Errorf("mandatory field %q is empty", "userKey") } out.UserKey = userKey } @@ -1129,10 +1129,10 @@ func (cb *configBuilder) convertPushoverConfig(ctx context.Context, in monitorin { token, err := cb.store.GetSecretKey(ctx, crKey.Namespace, *in.Token) if err != nil { - return nil, errors.Wrap(err, "failed to get token") + return nil, fmt.Errorf("failed to get token: %w", err) } if token == "" { - return nil, errors.Errorf("mandatory field %q is empty", "token") + return nil, fmt.Errorf("mandatory field %q is empty", "token") } out.Token = token } @@ -1181,7 +1181,7 @@ func (cb *configBuilder) convertTelegramConfig(ctx context.Context, in monitorin if in.BotToken != nil { botToken, err := cb.store.GetSecretKey(ctx, crKey.Namespace, *in.BotToken) if err != nil { - return nil, errors.Wrap(err, "failed to get bot token") + return nil, fmt.Errorf("failed to get bot token: %w", err) } if botToken == "" { return nil, fmt.Errorf("mandatory field %q is empty", "botToken") @@ -1222,12 +1222,12 @@ func (cb *configBuilder) convertSnsConfig(ctx context.Context, in monitoringv1al if in.Sigv4.AccessKey != nil && in.Sigv4.SecretKey != nil { accessKey, err := cb.store.GetSecretKey(ctx, crKey.Namespace, *in.Sigv4.AccessKey) if err != nil { - return nil, errors.Wrap(err, "failed to get access key") + return nil, fmt.Errorf("failed to get access key: %w", err) } secretKey, err := cb.store.GetSecretKey(ctx, crKey.Namespace, *in.Sigv4.SecretKey) if err != nil { - return nil, errors.Wrap(err, "failed to get AWS secret key") + return nil, fmt.Errorf("failed to get AWS secret key: %w", err) } out.Sigv4.AccessKey = accessKey @@ -1447,12 +1447,12 @@ func (cb *configBuilder) convertHTTPConfig(ctx context.Context, in monitoringv1a if in.BasicAuth != nil { username, err := cb.store.GetSecretKey(ctx, crKey.Namespace, in.BasicAuth.Username) if err != nil { - return nil, errors.Wrap(err, "failed to get BasicAuth username") + return nil, fmt.Errorf("failed to get BasicAuth username: %w", err) } password, err := cb.store.GetSecretKey(ctx, crKey.Namespace, in.BasicAuth.Password) if err != nil { - return nil, errors.Wrap(err, "failed to get BasicAuth password") + return nil, fmt.Errorf("failed to get BasicAuth password: %w", err) } if username != "" || password != "" { @@ -1463,7 +1463,7 @@ func (cb *configBuilder) convertHTTPConfig(ctx context.Context, in monitoringv1a if in.Authorization != nil { credentials, err := cb.store.GetSecretKey(ctx, crKey.Namespace, *in.Authorization.Credentials) if err != nil { - return nil, errors.Wrap(err, "failed to get Authorization credentials") + return nil, fmt.Errorf("failed to get Authorization credentials: %w", err) } if credentials != "" { @@ -1482,7 +1482,7 @@ func (cb *configBuilder) convertHTTPConfig(ctx context.Context, in monitoringv1a if in.BearerTokenSecret != nil { bearerToken, err := cb.store.GetSecretKey(ctx, crKey.Namespace, *in.BearerTokenSecret) if err != nil { - return nil, errors.Wrap(err, "failed to get bearer token") + return nil, fmt.Errorf("failed to get bearer token: %w", err) } out.BearerToken = bearerToken } @@ -1490,12 +1490,12 @@ func (cb *configBuilder) convertHTTPConfig(ctx context.Context, in monitoringv1a if in.OAuth2 != nil { clientID, err := cb.store.GetKey(ctx, crKey.Namespace, in.OAuth2.ClientID) if err != nil { - return nil, errors.Wrap(err, "failed to get clientID") + return nil, fmt.Errorf("failed to get clientID: %w", err) } clientSecret, err := cb.store.GetSecretKey(ctx, crKey.Namespace, in.OAuth2.ClientSecret) if err != nil { - return nil, errors.Wrap(err, "failed to get client secret") + return nil, fmt.Errorf("failed to get client secret: %w", err) } out.OAuth2 = &oauth2{ ClientID: clientID, @@ -1549,7 +1549,7 @@ func (c *alertmanagerConfig) sanitize(amVersion semver.Version, logger log.Logge for i, rule := range c.InhibitRules { if err := rule.sanitize(amVersion, logger); err != nil { - return errors.Wrapf(err, "inhibit_rules[%d]", i) + return fmt.Errorf("inhibit_rules[%d]: %w", i, err) } } @@ -1567,13 +1567,13 @@ func (c *alertmanagerConfig) sanitize(amVersion semver.Version, logger log.Logge for _, ti := range c.MuteTimeIntervals { if err := ti.sanitize(amVersion, logger); err != nil { - return errors.Wrapf(err, "mute_time_intervals[%s]", ti.Name) + return fmt.Errorf("mute_time_intervals[%s]: %w", ti.Name, err) } } for _, ti := range c.TimeIntervals { if err := ti.sanitize(amVersion, logger); err != nil { - return errors.Wrapf(err, "time_intervals[%s]", ti.Name) + return fmt.Errorf("time_intervals[%s]: %w", ti.Name, err) } } @@ -2033,7 +2033,7 @@ func (tc *telegramConfig) sanitize(amVersion semver.Version, logger log.Logger) } if tc.ChatID == 0 { - return errors.Errorf("mandatory field %q is empty", "chatID") + return fmt.Errorf("mandatory field %q is empty", "chatID") } if tc.BotTokenFile != "" && lessThanV0_26 { @@ -2071,7 +2071,7 @@ func (tc *webexConfig) sanitize(amVersion semver.Version, logger log.Logger) err } if tc.RoomID == "" { - return errors.Errorf("mandatory field %q is empty", "room_id") + return fmt.Errorf("mandatory field %q is empty", "room_id") } return tc.HTTPConfig.sanitize(amVersion, logger) @@ -2159,7 +2159,7 @@ func (r *route) sanitize(amVersion semver.Version, logger log.Logger) error { for i, child := range r.Routes { if err := child.sanitize(amVersion, logger); err != nil { - return errors.Wrapf(err, "route[%d]", i) + return fmt.Errorf("route[%d]: %w", i, err) } } // Set to nil if empty so that it doesn't show up in the resulting yaml. diff --git a/pkg/alertmanager/operator.go b/pkg/alertmanager/operator.go index 55c8bae59..bab247857 100644 --- a/pkg/alertmanager/operator.go +++ b/pkg/alertmanager/operator.go @@ -17,6 +17,7 @@ package alertmanager import ( "bytes" "context" + "errors" "fmt" "path" "regexp" @@ -27,7 +28,6 @@ import ( "github.com/go-kit/log" "github.com/go-kit/log/level" "github.com/mitchellh/hashstructure" - "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" @@ -114,17 +114,17 @@ type Config struct { func New(ctx context.Context, restConfig *rest.Config, c operator.Config, logger log.Logger, r prometheus.Registerer, canReadStorageClass bool) (*Operator, error) { client, err := kubernetes.NewForConfig(restConfig) if err != nil { - return nil, errors.Wrap(err, "instantiating kubernetes client failed") + return nil, fmt.Errorf("instantiating kubernetes client failed: %w", err) } mdClient, err := metadata.NewForConfig(restConfig) if err != nil { - return nil, errors.Wrap(err, "instantiating kubernetes client failed") + return nil, fmt.Errorf("instantiating kubernetes client failed: %w", err) } mclient, err := monitoringclient.NewForConfig(restConfig) if err != nil { - return nil, errors.Wrap(err, "instantiating monitoring client failed") + return nil, fmt.Errorf("instantiating monitoring client failed: %w", err) } // All the metrics exposed by the controller get the controller="alertmanager" label. @@ -175,7 +175,7 @@ func (c *Operator) bootstrap(ctx context.Context) error { var err error if _, err := labels.Parse(c.config.AlertManagerSelector); err != nil { - return errors.Wrap(err, "can not parse alertmanager selector value") + return fmt.Errorf("can not parse alertmanager selector value: %w", err) } c.metrics.MustRegister(c.reconciliations) @@ -193,7 +193,7 @@ func (c *Operator) bootstrap(ctx context.Context) error { monitoringv1.SchemeGroupVersion.WithResource(monitoringv1.AlertmanagerName), ) if err != nil { - return errors.Wrap(err, "error creating alertmanager informers") + return fmt.Errorf("error creating alertmanager informers: %w", err) } var alertmanagerStores []cache.Store @@ -213,12 +213,12 @@ func (c *Operator) bootstrap(ctx context.Context) error { monitoringv1alpha1.SchemeGroupVersion.WithResource(monitoringv1alpha1.AlertmanagerConfigName), ) if err != nil { - return errors.Wrap(err, "error creating alertmanagerconfig informers") + return fmt.Errorf("error creating alertmanagerconfig informers: %w", err) } secretListWatchSelector, err := fields.ParseSelector(c.config.SecretListWatchSelector) if err != nil { - return errors.Wrap(err, "can not parse secrets selector value") + return fmt.Errorf("can not parse secrets selector value: %w", err) } c.secrInfs, err = informers.NewInformersForResource( @@ -234,7 +234,7 @@ func (c *Operator) bootstrap(ctx context.Context) error { v1.SchemeGroupVersion.WithResource("secrets"), ) if err != nil { - return errors.Wrap(err, "error creating secret informers") + return fmt.Errorf("error creating secret informers: %w", err) } c.ssetInfs, err = informers.NewInformersForResource( @@ -248,7 +248,7 @@ func (c *Operator) bootstrap(ctx context.Context) error { appsv1.SchemeGroupVersion.WithResource("statefulsets"), ) if err != nil { - return errors.Wrap(err, "error creating statefulset informers") + return fmt.Errorf("error creating statefulset informers: %w", err) } newNamespaceInformer := func(o *Operator, allowList map[string]struct{}) (cache.SharedIndexInformer, error) { @@ -303,7 +303,7 @@ func (c *Operator) waitForCacheSync(ctx context.Context) error { } { for _, inf := range infs.informersForResource.GetInformers() { if !operator.WaitForNamedCacheSync(ctx, "alertmanager", log.With(c.logger, "informer", infs.name), inf.Informer()) { - return errors.Errorf("failed to sync cache for %s informer", infs.name) + return fmt.Errorf("failed to sync cache for %s informer", infs.name) } } } @@ -316,7 +316,7 @@ func (c *Operator) waitForCacheSync(ctx context.Context) error { {"AlertmanagerConfigNamespace", c.nsAlrtCfgInf}, } { if !operator.WaitForNamedCacheSync(ctx, "alertmanager", log.With(c.logger, "informer", inf.name), inf.informer) { - return errors.Errorf("failed to sync cache for %s informer", inf.name) + return fmt.Errorf("failed to sync cache for %s informer", inf.name) } } @@ -637,7 +637,7 @@ func (c *Operator) sync(ctx context.Context, key string) error { am := aobj.(*monitoringv1.Alertmanager) am = am.DeepCopy() if err := k8sutil.AddTypeInformationToObject(am); err != nil { - return errors.Wrap(err, "failed to set Alertmanager type information") + return fmt.Errorf("failed to set Alertmanager type information: %w", err) } if am.Spec.Paused { @@ -656,22 +656,22 @@ func (c *Operator) sync(ctx context.Context, key string) error { assetStore := assets.NewStore(c.kclient.CoreV1(), c.kclient.CoreV1()) if err := c.provisionAlertmanagerConfiguration(ctx, am, assetStore); err != nil { - return errors.Wrap(err, "provision alertmanager configuration") + return fmt.Errorf("provision alertmanager configuration: %w", err) } tlsAssets, err := c.createOrUpdateTLSAssetSecrets(ctx, am, assetStore) if err != nil { - return errors.Wrap(err, "creating tls asset secrets failed") + return fmt.Errorf("creating tls asset secrets failed: %w", err) } if err := c.createOrUpdateWebConfigSecret(ctx, am); err != nil { - return errors.Wrap(err, "synchronizing web config secret failed") + return fmt.Errorf("synchronizing web config secret failed: %w", err) } // Create governing service if it doesn't exist. svcClient := c.kclient.CoreV1().Services(am.Namespace) if err = k8sutil.CreateOrUpdateService(ctx, svcClient, makeStatefulSetService(am, c.config)); err != nil { - return errors.Wrap(err, "synchronizing governing service failed") + return fmt.Errorf("synchronizing governing service failed: %w", err) } existingStatefulSet, err := c.getStatefulSetFromAlertmanagerKey(key) @@ -710,7 +710,7 @@ func (c *Operator) sync(ctx context.Context, key string) error { level.Debug(logger).Log("msg", "no current statefulset found") level.Debug(logger).Log("msg", "creating statefulset") if _, err := ssetClient.Create(ctx, sset, metav1.CreateOptions{}); err != nil { - return errors.Wrap(err, "creating statefulset failed") + return fmt.Errorf("creating statefulset failed: %w", err) } return nil } @@ -730,13 +730,13 @@ func (c *Operator) sync(ctx context.Context, key string) error { level.Info(logger).Log("msg", "recreating AlertManager StatefulSet because the update operation wasn't possible", "reason", strings.Join(failMsg, ", ")) propagationPolicy := metav1.DeletePropagationForeground if err := ssetClient.Delete(ctx, sset.GetName(), metav1.DeleteOptions{PropagationPolicy: &propagationPolicy}); err != nil { - return errors.Wrap(err, "failed to delete StatefulSet to avoid forbidden action") + return fmt.Errorf("failed to delete StatefulSet to avoid forbidden action: %w", err) } return nil } if err != nil { - return errors.Wrap(err, "updating StatefulSet failed") + return fmt.Errorf("updating StatefulSet failed: %w", err) } return nil @@ -751,7 +751,7 @@ func (c *Operator) getAlertmanagerFromKey(key string) (*monitoringv1.Alertmanage level.Info(c.logger).Log("msg", "Alertmanager not found", "key", key) return nil, nil } - return nil, errors.Wrap(err, "failed to retrieve Alertmanager from informer") + return nil, fmt.Errorf("failed to retrieve Alertmanager from informer: %w", err) } return obj.(*monitoringv1.Alertmanager).DeepCopy(), nil @@ -769,7 +769,7 @@ func (c *Operator) getStatefulSetFromAlertmanagerKey(key string) (*appsv1.Statef level.Info(c.logger).Log("msg", "StatefulSet not found", "key", ssetName) return nil, nil } - return nil, errors.Wrap(err, "failed to retrieve StatefulSet from informer") + return nil, fmt.Errorf("failed to retrieve StatefulSet from informer: %w", err) } return obj.(*appsv1.StatefulSet).DeepCopy(), nil @@ -790,7 +790,7 @@ func (c *Operator) UpdateStatus(ctx context.Context, key string) error { sset, err := c.getStatefulSetFromAlertmanagerKey(key) if err != nil { - return errors.Wrap(err, "failed to get StatefulSet") + return fmt.Errorf("failed to get StatefulSet: %w", err) } if sset != nil && c.rr.DeletionInProgress(sset) { @@ -799,7 +799,7 @@ func (c *Operator) UpdateStatus(ctx context.Context, key string) error { stsReporter, err := operator.NewStatefulSetReporter(ctx, c.kclient, sset) if err != nil { - return errors.Wrap(err, "failed to retrieve statefulset state") + return fmt.Errorf("failed to retrieve statefulset state: %w", err) } availableCondition := stsReporter.Update(a) @@ -808,7 +808,7 @@ func (c *Operator) UpdateStatus(ctx context.Context, key string) error { a.Status.Paused = a.Spec.Paused if _, err = c.mclient.MonitoringV1().Alertmanagers(a.Namespace).ApplyStatus(ctx, ApplyConfigurationFromAlertmanager(a), metav1.ApplyOptions{FieldManager: operator.PrometheusOperatorFieldManager, Force: true}); err != nil { - return errors.Wrap(err, "failed to apply status subresource") + return fmt.Errorf("failed to apply status subresource: %w", err) } return nil @@ -845,7 +845,7 @@ func createSSetInputHash(a monitoringv1.Alertmanager, c Config, tlsAssets *opera nil, ) if err != nil { - return "", errors.Wrap(err, "failed to calculate combined hash") + return "", fmt.Errorf("failed to calculate combined hash: %w", err) } return fmt.Sprintf("%d", hash), nil @@ -908,12 +908,12 @@ func (c *Operator) provisionAlertmanagerConfiguration(ctx context.Context, am *m amRawConfiguration, additionalData, err := c.loadConfigurationFromSecret(ctx, am) if err != nil { - return errors.Wrap(err, "failed to retrieve configuration from secret") + return fmt.Errorf("failed to retrieve configuration from secret: %w", err) } err = c.createOrUpdateGeneratedConfigSecret(ctx, am, amRawConfiguration, additionalData) if err != nil { - return errors.Wrap(err, "create or update generated config secret failed") + return fmt.Errorf("create or update generated config secret failed: %w", err) } return nil @@ -922,12 +922,12 @@ func (c *Operator) provisionAlertmanagerConfiguration(ctx context.Context, am *m amVersion := operator.StringValOrDefault(am.Spec.Version, operator.DefaultAlertmanagerVersion) version, err := semver.ParseTolerant(amVersion) if err != nil { - return errors.Wrap(err, "failed to parse alertmanager version") + return fmt.Errorf("failed to parse alertmanager version: %w", err) } amConfigs, err := c.selectAlertmanagerConfigs(ctx, am, version, store) if err != nil { - return errors.Wrap(err, "failed to select AlertmanagerConfig objects") + return fmt.Errorf("failed to select AlertmanagerConfig objects: %w", err) } var ( @@ -940,12 +940,12 @@ func (c *Operator) provisionAlertmanagerConfiguration(ctx context.Context, am *m globalAmConfig, err := c.mclient.MonitoringV1alpha1().AlertmanagerConfigs(am.Namespace). Get(ctx, am.Spec.AlertmanagerConfiguration.Name, metav1.GetOptions{}) if err != nil { - return errors.Wrap(err, "failed to get global AlertmanagerConfig") + return fmt.Errorf("failed to get global AlertmanagerConfig: %w", err) } err = cfgBuilder.initializeFromAlertmanagerConfig(ctx, am.Spec.AlertmanagerConfiguration.Global, globalAmConfig) if err != nil { - return errors.Wrap(err, "failed to initialize from global AlertmangerConfig") + return fmt.Errorf("failed to initialize from global AlertmangerConfig: %w", err) } // set templates @@ -966,27 +966,27 @@ func (c *Operator) provisionAlertmanagerConfiguration(ctx context.Context, am *m amRawConfiguration, additionalData, err = c.loadConfigurationFromSecret(ctx, am) if err != nil { - return errors.Wrap(err, "failed to retrieve configuration from secret") + return fmt.Errorf("failed to retrieve configuration from secret: %w", err) } err = cfgBuilder.initializeFromRawConfiguration(amRawConfiguration) if err != nil { - return errors.Wrap(err, "failed to initialize from secret") + return fmt.Errorf("failed to initialize from secret: %w", err) } } if err := cfgBuilder.addAlertmanagerConfigs(ctx, amConfigs); err != nil { - return errors.Wrap(err, "failed to generate Alertmanager configuration") + return fmt.Errorf("failed to generate Alertmanager configuration: %w", err) } generatedConfig, err := cfgBuilder.marshalJSON() if err != nil { - return errors.Wrap(err, "failed to marshal configuration") + return fmt.Errorf("failed to marshal configuration: %w", err) } err = c.createOrUpdateGeneratedConfigSecret(ctx, am, generatedConfig, additionalData) if err != nil { - return errors.Wrap(err, "failed to create or update the generated configuration secret") + return fmt.Errorf("failed to create or update the generated configuration secret: %w", err) } return nil @@ -1021,13 +1021,13 @@ func (c *Operator) createOrUpdateGeneratedConfigSecret(ctx context.Context, am * // Compress config to avoid 1mb secret limit for a while var buf bytes.Buffer if err := operator.GzipConfig(&buf, conf); err != nil { - return errors.Wrap(err, "couldnt gzip config") + return fmt.Errorf("couldnt gzip config: %w", err) } generatedConfigSecret.Data[alertmanagerConfigFileCompressed] = buf.Bytes() err := k8sutil.CreateOrUpdateSecret(ctx, sClient, generatedConfigSecret) if err != nil { - return errors.Wrap(err, "failed to update generated config secret") + return fmt.Errorf("failed to update generated config secret: %w", err) } return nil @@ -1051,7 +1051,7 @@ func (c *Operator) selectAlertmanagerConfigs(ctx context.Context, am *monitoring namespaces = append(namespaces, obj.(*v1.Namespace).Name) }) if err != nil { - return nil, errors.Wrap(err, "failed to list namespaces") + return nil, fmt.Errorf("failed to list namespaces: %w", err) } level.Debug(c.logger).Log("msg", "filtering namespaces to select AlertmanagerConfigs from", "namespaces", strings.Join(namespaces, ","), "namespace", am.Namespace, "alertmanager", am.Name) @@ -1078,7 +1078,7 @@ func (c *Operator) selectAlertmanagerConfigs(ctx context.Context, am *monitoring } }) if err != nil { - return nil, errors.Wrapf(err, "failed to list alertmanager configs in namespace %s", ns) + return nil, fmt.Errorf("failed to list alertmanager configs in namespace %s: %w", ns, err) } } @@ -1405,7 +1405,7 @@ func checkWebhookConfigs( return err } if _, err := validation.ValidateURL(strings.TrimSpace(url)); err != nil { - return errors.Wrapf(err, "webhook 'url' %s invalid", url) + return fmt.Errorf("webhook 'url' %s invalid: %w", url, err) } } @@ -1533,7 +1533,7 @@ func checkPushoverConfigs( ) error { checkSecret := func(secret *v1.SecretKeySelector, name string) error { if secret == nil { - return errors.Errorf("mandatory field %s is empty", name) + return fmt.Errorf("mandatory field %s is empty", name) } s, err := store.GetSecretKey(ctx, namespace, *secret) if err != nil { @@ -1642,13 +1642,13 @@ func checkInhibitRules(amc *monitoringv1alpha1.AlertmanagerConfig, version semve for j, tm := range rule.TargetMatch { if err := tm.Validate(); err != nil { - return errors.Wrapf(err, "invalid targetMatchers[%d] in inhibitRule[%d] in config %s", j, i, amc.Name) + return fmt.Errorf("invalid targetMatchers[%d] in inhibitRule[%d] in config %s: %w", j, i, amc.Name, err) } } for j, sm := range rule.SourceMatch { if err := sm.Validate(); err != nil { - return errors.Wrapf(err, "invalid sourceMatchers[%d] in inhibitRule[%d] in config %s", j, i, amc.Name) + return fmt.Errorf("invalid sourceMatchers[%d] in inhibitRule[%d] in config %s: %w", j, i, amc.Name, err) } } } @@ -1696,7 +1696,7 @@ func (c *Operator) createOrUpdateTLSAssetSecrets(ctx context.Context, am *monito sClient := c.kclient.CoreV1().Secrets(am.Namespace) if err := sSecret.StoreSecrets(ctx, sClient); err != nil { - return nil, errors.Wrapf(err, "failed to create TLS assets secret for Alertmanager") + return nil, fmt.Errorf("failed to create TLS assets secret for Alertmanager: %w", err) } level.Debug(c.logger).Log("msg", "tls-asset secret: stored") @@ -1739,7 +1739,7 @@ func (c *Operator) createOrUpdateWebConfigSecret(ctx context.Context, a *monitor fields, ) if err != nil { - return errors.Wrap(err, "failed to initialize web config") + return fmt.Errorf("failed to initialize web config: %w", err) } secretClient := c.kclient.CoreV1().Secrets(a.Namespace) @@ -1755,7 +1755,7 @@ func (c *Operator) createOrUpdateWebConfigSecret(ctx context.Context, a *monitor secretLabels := c.config.Labels.Merge(managedByOperatorLabels) if err := webConfig.CreateOrUpdateWebConfigSecret(ctx, secretClient, secretAnnotations, secretLabels, ownerReference); err != nil { - return errors.Wrap(err, "failed to reconcile web config secret") + return fmt.Errorf("failed to reconcile web config secret: %w", err) } return nil diff --git a/pkg/alertmanager/statefulset.go b/pkg/alertmanager/statefulset.go index 247272f9e..d0520caad 100644 --- a/pkg/alertmanager/statefulset.go +++ b/pkg/alertmanager/statefulset.go @@ -21,7 +21,6 @@ import ( "strings" "github.com/blang/semver/v4" - "github.com/pkg/errors" appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" @@ -235,12 +234,12 @@ func makeStatefulSetSpec(a *monitoringv1.Alertmanager, config Config, tlsAssetSe operator.StringValOrDefault(a.Spec.SHA, ""), ) if err != nil { - return nil, errors.Wrap(err, "failed to build image path") + return nil, fmt.Errorf("failed to build image path: %w", err) } version, err := semver.ParseTolerant(amVersion) if err != nil { - return nil, errors.Wrap(err, "failed to parse alertmanager version") + return nil, fmt.Errorf("failed to parse alertmanager version: %w", err) } amArgs := []string{ @@ -459,7 +458,7 @@ func makeStatefulSetSpec(a *monitoringv1.Alertmanager, config Config, tlsAssetSe }) } default: - return nil, errors.Errorf("unsupported Alertmanager major version %s", version) + return nil, fmt.Errorf("unsupported Alertmanager major version %s", version) } assetsVolume := v1.Volume{ @@ -734,7 +733,7 @@ func makeStatefulSetSpec(a *monitoringv1.Alertmanager, config Config, tlsAssetSe containers, err := k8sutil.MergePatchContainers(defaultContainers, a.Spec.Containers) if err != nil { - return nil, errors.Wrap(err, "failed to merge containers spec") + return nil, fmt.Errorf("failed to merge containers spec: %w", err) } var minReadySeconds int32 @@ -760,7 +759,7 @@ func makeStatefulSetSpec(a *monitoringv1.Alertmanager, config Config, tlsAssetSe initContainers, err := k8sutil.MergePatchContainers(operatorInitContainers, a.Spec.InitContainers) if err != nil { - return nil, errors.Wrap(err, "failed to merge init containers spec") + return nil, fmt.Errorf("failed to merge init containers spec: %w", err) } // PodManagementPolicy is set to Parallel to mitigate issues in kubernetes: https://github.com/kubernetes/kubernetes/issues/60164 diff --git a/pkg/alertmanager/validation/v1alpha1/validation.go b/pkg/alertmanager/validation/v1alpha1/validation.go index 08591e526..4d8404589 100644 --- a/pkg/alertmanager/validation/v1alpha1/validation.go +++ b/pkg/alertmanager/validation/v1alpha1/validation.go @@ -15,13 +15,12 @@ package v1alpha1 import ( + "errors" "fmt" "net" "regexp" "strings" - "github.com/pkg/errors" - "github.com/prometheus-operator/prometheus-operator/pkg/alertmanager/validation" monitoringv1alpha1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1alpha1" ) @@ -52,56 +51,56 @@ func validateReceivers(receivers []monitoringv1alpha1.Receiver) (map[string]stru for _, receiver := range receivers { if _, found := receiverNames[receiver.Name]; found { - return nil, errors.Errorf("%q receiver is not unique", receiver.Name) + return nil, fmt.Errorf("%q receiver is not unique: %w", receiver.Name, err) } receiverNames[receiver.Name] = struct{}{} if err = validatePagerDutyConfigs(receiver.PagerDutyConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'pagerDutyConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'pagerDutyConfig' - receiver %s: %w", receiver.Name, err) } if err := validateOpsGenieConfigs(receiver.OpsGenieConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'opsGenieConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'opsGenieConfig' - receiver %s: %w", receiver.Name, err) } if err := validateSlackConfigs(receiver.SlackConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'slackConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'slackConfig' - receiver %s: %w", receiver.Name, err) } if err := validateWebhookConfigs(receiver.WebhookConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'webhookConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'webhookConfig' - receiver %s: %w", receiver.Name, err) } if err := validateWechatConfigs(receiver.WeChatConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'weChatConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'weChatConfig' - receiver %s: %w", receiver.Name, err) } if err := validateEmailConfig(receiver.EmailConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'emailConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'emailConfig' - receiver %s: %w", receiver.Name, err) } if err := validateVictorOpsConfigs(receiver.VictorOpsConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'victorOpsConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'victorOpsConfig' - receiver %s: %w", receiver.Name, err) } if err := validatePushoverConfigs(receiver.PushoverConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'pushOverConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'pushOverConfig' - receiver %s: %w", receiver.Name, err) } if err := validateSnsConfigs(receiver.SNSConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'snsConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'snsConfig' - receiver %s: %w", receiver.Name, err) } if err := validateTelegramConfigs(receiver.TelegramConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'telegramConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'telegramConfig' - receiver %s: %w", receiver.Name, err) } if err := validateWebexConfigs(receiver.WebexConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'webexConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'webexConfig' - receiver %s: %w", receiver.Name, err) } if err := validateDiscordConfigs(receiver.DiscordConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'discordConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'discordConfig' - receiver %s: %w", receiver.Name, err) } } @@ -112,7 +111,7 @@ func validatePagerDutyConfigs(configs []monitoringv1alpha1.PagerDutyConfig) erro for _, conf := range configs { if conf.URL != "" { if _, err := validation.ValidateURL(conf.URL); err != nil { - return errors.Wrap(err, "pagerduty validation failed for 'url'") + return fmt.Errorf("pagerduty validation failed for 'url': %w", err) } } if conf.RoutingKey == nil && conf.ServiceKey == nil { @@ -133,7 +132,7 @@ func validateOpsGenieConfigs(configs []monitoringv1alpha1.OpsGenieConfig) error } if config.APIURL != "" { if _, err := validation.ValidateURL(config.APIURL); err != nil { - return errors.Wrap(err, "invalid 'apiURL'") + return fmt.Errorf("invalid 'apiURL': %w", err) } } @@ -173,7 +172,7 @@ func validateWebhookConfigs(configs []monitoringv1alpha1.WebhookConfig) error { } if config.URL != nil { if _, err := validation.ValidateURL(*config.URL); err != nil { - return errors.Wrapf(err, "invalid 'url'") + return fmt.Errorf("invalid 'url': %w", err) } } @@ -188,7 +187,7 @@ func validateWechatConfigs(configs []monitoringv1alpha1.WeChatConfig) error { for _, config := range configs { if config.APIURL != "" { if _, err := validation.ValidateURL(config.APIURL); err != nil { - return errors.Wrap(err, "invalid 'apiURL'") + return fmt.Errorf("invalid 'apiURL': %w", err) } } @@ -208,7 +207,7 @@ func validateEmailConfig(configs []monitoringv1alpha1.EmailConfig) error { if config.Smarthost != "" { _, _, err := net.SplitHostPort(config.Smarthost) if err != nil { - return errors.Wrapf(err, "invalid field 'smarthost': %s", config.Smarthost) + return fmt.Errorf("invalid 'smarthost' %s: %w", config.Smarthost, err) } } @@ -255,7 +254,7 @@ func validateVictorOpsConfigs(configs []monitoringv1alpha1.VictorOpsConfig) erro if config.APIURL != "" { if _, err := validation.ValidateURL(config.APIURL); err != nil { - return errors.Wrapf(err, "'apiURL' %s invalid", config.APIURL) + return fmt.Errorf("'apiURL' %s invalid: %w", config.APIURL, err) } } @@ -269,11 +268,11 @@ func validateVictorOpsConfigs(configs []monitoringv1alpha1.VictorOpsConfig) erro func validatePushoverConfigs(configs []monitoringv1alpha1.PushoverConfig) error { for _, config := range configs { if config.UserKey == nil { - return errors.Errorf("mandatory field %q is empty", "userKey") + return fmt.Errorf("mandatory field %q is empty", "userKey") } if config.Token == nil { - return errors.Errorf("mandatory field %q is empty", "token") + return fmt.Errorf("mandatory field %q is empty", "token") } if err := config.HTTPConfig.Validate(); err != nil { @@ -320,7 +319,7 @@ func validateWebexConfigs(configs []monitoringv1alpha1.WebexConfig) error { for _, config := range configs { if *config.APIURL != "" { if _, err := validation.ValidateURL(string(*config.APIURL)); err != nil { - return errors.Wrap(err, "invalid 'apiURL'") + return fmt.Errorf("invalid 'apiURL': %w", err) } } @@ -342,11 +341,11 @@ func validateAlertManagerRoutes(r *monitoringv1alpha1.Route, receivers, muteTime if r.Receiver == "" { if topLevelRoute { - return errors.Errorf("root route must define a receiver") + return errors.New("root route must define a receiver") } } else { if _, found := receivers[r.Receiver]; !found { - return errors.Errorf("receiver %q not found", r.Receiver) + return fmt.Errorf("receiver %q not found", r.Receiver) } } @@ -354,38 +353,38 @@ func validateAlertManagerRoutes(r *monitoringv1alpha1.Route, receivers, muteTime groupedBy := make(map[string]struct{}, groupLen) for _, str := range r.GroupBy { if _, found := groupedBy[str]; found { - return errors.Errorf("duplicate values not permitted in route 'groupBy': %v", r.GroupBy) + return fmt.Errorf("duplicate values not permitted in route 'groupBy': %v", r.GroupBy) } groupedBy[str] = struct{}{} } if _, found := groupedBy["..."]; found && groupLen > 1 { - return errors.Errorf("'...' must be a sole value in route 'groupBy': %v", r.GroupBy) + return fmt.Errorf("'...' must be a sole value in route 'groupBy': %v", r.GroupBy) } } for _, namedMuteTimeInterval := range r.MuteTimeIntervals { if _, found := muteTimeIntervals[namedMuteTimeInterval]; !found { - return errors.Errorf("mute time interval %q not found", namedMuteTimeInterval) + return fmt.Errorf("mute time interval %q not found", namedMuteTimeInterval) } } for _, namedActiveTimeInterval := range r.ActiveTimeIntervals { if _, found := muteTimeIntervals[namedActiveTimeInterval]; !found { - return errors.Errorf("time interval %q not found", namedActiveTimeInterval) + return fmt.Errorf("time interval %q not found", namedActiveTimeInterval) } } // validate that if defaults are set, they match regex if r.GroupInterval != "" && !durationRe.MatchString(r.GroupInterval) { - return errors.Errorf("groupInterval %s does not match required regex: %s", r.GroupInterval, durationRe.String()) + return fmt.Errorf("groupInterval %s does not match required regex: %s", r.GroupInterval, durationRe.String()) } if r.GroupWait != "" && !durationRe.MatchString(r.GroupWait) { - return errors.Errorf("groupWait %s does not match required regex: %s", r.GroupWait, durationRe.String()) + return fmt.Errorf("groupWait %s does not match required regex: %s", r.GroupWait, durationRe.String()) } if r.RepeatInterval != "" && !durationRe.MatchString(r.RepeatInterval) { - return errors.Errorf("repeatInterval %s does not match required regex: %s", r.RepeatInterval, durationRe.String()) + return fmt.Errorf("repeatInterval %s does not match required regex: %s", r.RepeatInterval, durationRe.String()) } children, err := r.ChildRoutes() @@ -395,7 +394,7 @@ func validateAlertManagerRoutes(r *monitoringv1alpha1.Route, receivers, muteTime for i := range children { if err := validateAlertManagerRoutes(&children[i], receivers, muteTimeIntervals, false); err != nil { - return errors.Wrapf(err, "route[%d]", i) + return fmt.Errorf("route[%d]: %w", i, err) } } @@ -407,7 +406,7 @@ func validateMuteTimeIntervals(muteTimeIntervals []monitoringv1alpha1.MuteTimeIn for i, mti := range muteTimeIntervals { if err := mti.Validate(); err != nil { - return nil, errors.Wrapf(err, "mute time interval[%d] is invalid", i) + return nil, fmt.Errorf("mute time interval[%d] is invalid: %w", i, err) } muteTimeIntervalNames[mti.Name] = struct{}{} } diff --git a/pkg/alertmanager/validation/v1beta1/validation.go b/pkg/alertmanager/validation/v1beta1/validation.go index 823d5cc23..9b783cb0f 100644 --- a/pkg/alertmanager/validation/v1beta1/validation.go +++ b/pkg/alertmanager/validation/v1beta1/validation.go @@ -15,13 +15,12 @@ package v1beta1 import ( + "errors" "fmt" "net" "regexp" "strings" - "github.com/pkg/errors" - "github.com/prometheus-operator/prometheus-operator/pkg/alertmanager/validation" monitoringv1beta1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1beta1" ) @@ -52,56 +51,56 @@ func validateReceivers(receivers []monitoringv1beta1.Receiver) (map[string]struc for _, receiver := range receivers { if _, found := receiverNames[receiver.Name]; found { - return nil, errors.Errorf("%q receiver is not unique", receiver.Name) + return nil, fmt.Errorf("%q receiver is not unique", receiver.Name) } receiverNames[receiver.Name] = struct{}{} if err = validatePagerDutyConfigs(receiver.PagerDutyConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'pagerDutyConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'pagerDutyConfig' - receiver %s: %w", receiver.Name, err) } if err := validateOpsGenieConfigs(receiver.OpsGenieConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'opsGenieConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'opsGenieConfig' - receiver %s: %w", receiver.Name, err) } if err := validateSlackConfigs(receiver.SlackConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'slackConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'slackConfig' - receiver %s: %w", receiver.Name, err) } if err := validateWebhookConfigs(receiver.WebhookConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'webhookConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'webhookConfig' - receiver %s: %w", receiver.Name, err) } if err := validateWechatConfigs(receiver.WeChatConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'weChatConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'weChatConfig' - receiver %s: %w", receiver.Name, err) } if err := validateEmailConfig(receiver.EmailConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'emailConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'emailConfig' - receiver %s: %w", receiver.Name, err) } if err := validateVictorOpsConfigs(receiver.VictorOpsConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'victorOpsConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'victorOpsConfig' - receiver %s: %w", receiver.Name, err) } if err := validatePushoverConfigs(receiver.PushoverConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'pushOverConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'pushOverConfig' - receiver %s: %w", receiver.Name, err) } if err := validateSnsConfigs(receiver.SNSConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'snsConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'snsConfig' - receiver %s: %w", receiver.Name, err) } if err := validateTelegramConfigs(receiver.TelegramConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'telegramConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'telegramConfig' - receiver %s: %w", receiver.Name, err) } if err := validateDiscordConfigs(receiver.DiscordConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'discordConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'discordConfig' - receiver %s: %w", receiver.Name, err) } if err := validateWebexConfigs(receiver.WebexConfigs); err != nil { - return nil, errors.Wrapf(err, "failed to validate 'webexConfig' - receiver %s", receiver.Name) + return nil, fmt.Errorf("failed to validate 'webexConfig' - receiver %s: %w", receiver.Name, err) } } @@ -112,7 +111,7 @@ func validatePagerDutyConfigs(configs []monitoringv1beta1.PagerDutyConfig) error for _, conf := range configs { if conf.URL != "" { if _, err := validation.ValidateURL(conf.URL); err != nil { - return errors.Wrap(err, "pagerduty validation failed for 'url'") + return fmt.Errorf("pagerduty validation failed for 'url': %w", err) } } if conf.RoutingKey == nil && conf.ServiceKey == nil { @@ -133,7 +132,7 @@ func validateOpsGenieConfigs(configs []monitoringv1beta1.OpsGenieConfig) error { } if config.APIURL != "" { if _, err := validation.ValidateURL(config.APIURL); err != nil { - return errors.Wrap(err, "invalid 'apiURL'") + return fmt.Errorf("invalid 'apiURL': %w", err) } } @@ -164,7 +163,7 @@ func validateWebhookConfigs(configs []monitoringv1beta1.WebhookConfig) error { } if config.URL != nil { if _, err := validation.ValidateURL(*config.URL); err != nil { - return errors.Wrapf(err, "invalid 'url'") + return fmt.Errorf("invalid 'url': %w", err) } } @@ -179,7 +178,7 @@ func validateWechatConfigs(configs []monitoringv1beta1.WeChatConfig) error { for _, config := range configs { if config.APIURL != "" { if _, err := validation.ValidateURL(config.APIURL); err != nil { - return errors.Wrap(err, "invalid 'apiURL'") + return fmt.Errorf("invalid 'apiURL': %w", err) } } @@ -199,7 +198,7 @@ func validateEmailConfig(configs []monitoringv1beta1.EmailConfig) error { if config.Smarthost != "" { _, _, err := net.SplitHostPort(config.Smarthost) if err != nil { - return errors.Wrapf(err, "invalid field 'smarthost': %s", config.Smarthost) + return fmt.Errorf("invalid 'smarthost' %s: %w", config.Smarthost, err) } } @@ -246,7 +245,7 @@ func validateVictorOpsConfigs(configs []monitoringv1beta1.VictorOpsConfig) error if config.APIURL != "" { if _, err := validation.ValidateURL(config.APIURL); err != nil { - return errors.Wrapf(err, "'apiURL' %s invalid", config.APIURL) + return fmt.Errorf("'apiURL' %s invalid: %w", config.APIURL, err) } } @@ -260,11 +259,11 @@ func validateVictorOpsConfigs(configs []monitoringv1beta1.VictorOpsConfig) error func validatePushoverConfigs(configs []monitoringv1beta1.PushoverConfig) error { for _, config := range configs { if config.UserKey == nil { - return errors.Errorf("mandatory field %q is empty", "userKey") + return fmt.Errorf("mandatory field %q is empty", "userKey") } if config.Token == nil { - return errors.Errorf("mandatory field %q is empty", "token") + return fmt.Errorf("mandatory field %q is empty", "token") } if err := config.HTTPConfig.Validate(); err != nil { @@ -311,7 +310,7 @@ func validateWebexConfigs(configs []monitoringv1beta1.WebexConfig) error { for _, config := range configs { if *config.APIURL != "" { if _, err := validation.ValidateURL(string(*config.APIURL)); err != nil { - return errors.Wrap(err, "invalid 'apiURL'") + return fmt.Errorf("invalid 'apiURL': %w", err) } } @@ -343,11 +342,11 @@ func validateAlertManagerRoutes(r *monitoringv1beta1.Route, receivers, timeInter if r.Receiver == "" { if topLevelRoute { - return errors.Errorf("root route must define a receiver") + return fmt.Errorf("root route must define a receiver") } } else { if _, found := receivers[r.Receiver]; !found { - return errors.Errorf("receiver %q not found", r.Receiver) + return fmt.Errorf("receiver %q not found", r.Receiver) } } @@ -355,38 +354,38 @@ func validateAlertManagerRoutes(r *monitoringv1beta1.Route, receivers, timeInter groupedBy := make(map[string]struct{}, groupLen) for _, str := range r.GroupBy { if _, found := groupedBy[str]; found { - return errors.Errorf("duplicate values not permitted in route 'groupBy': %v", r.GroupBy) + return fmt.Errorf("duplicate values not permitted in route 'groupBy': %v", r.GroupBy) } groupedBy[str] = struct{}{} } if _, found := groupedBy["..."]; found && groupLen > 1 { - return errors.Errorf("'...' must be a sole value in route 'groupBy': %v", r.GroupBy) + return fmt.Errorf("'...' must be a sole value in route 'groupBy': %v", r.GroupBy) } } for _, namedTimeInterval := range r.MuteTimeIntervals { if _, found := timeIntervals[namedTimeInterval]; !found { - return errors.Errorf("time interval %q not found", namedTimeInterval) + return fmt.Errorf("time interval %q not found", namedTimeInterval) } } for _, namedTimeInterval := range r.ActiveTimeIntervals { if _, found := timeIntervals[namedTimeInterval]; !found { - return errors.Errorf("time interval %q not found", namedTimeInterval) + return fmt.Errorf("time interval %q not found", namedTimeInterval) } } // validate that if defaults are set, they match regex if r.GroupInterval != "" && !durationRe.MatchString(r.GroupInterval) { - return errors.Errorf("groupInterval %s does not match required regex: %s", r.GroupInterval, durationRe.String()) + return fmt.Errorf("groupInterval %s does not match required regex: %s", r.GroupInterval, durationRe.String()) } if r.GroupWait != "" && !durationRe.MatchString(r.GroupWait) { - return errors.Errorf("groupWait %s does not match required regex: %s", r.GroupWait, durationRe.String()) + return fmt.Errorf("groupWait %s does not match required regex: %s", r.GroupWait, durationRe.String()) } if r.RepeatInterval != "" && !durationRe.MatchString(r.RepeatInterval) { - return errors.Errorf("repeatInterval %s does not match required regex: %s", r.RepeatInterval, durationRe.String()) + return fmt.Errorf("repeatInterval %s does not match required regex: %s", r.RepeatInterval, durationRe.String()) } children, err := r.ChildRoutes() @@ -396,7 +395,7 @@ func validateAlertManagerRoutes(r *monitoringv1beta1.Route, receivers, timeInter for i := range children { if err := validateAlertManagerRoutes(&children[i], receivers, timeIntervals, false); err != nil { - return errors.Wrapf(err, "route[%d]", i) + return fmt.Errorf("route[%d]: %w", i, err) } } @@ -408,7 +407,7 @@ func validateTimeIntervals(timeIntervals []monitoringv1beta1.TimeInterval) (map[ for i, ti := range timeIntervals { if err := ti.Validate(); err != nil { - return nil, errors.Wrapf(err, "time interval[%d] is invalid", i) + return nil, fmt.Errorf("time interval[%d] is invalid: %w", i, err) } timeIntervalNames[ti.Name] = struct{}{} }