diff --git a/cmd/serve.go b/cmd/serve.go index fe1c83ce..c8bbbdbf 100644 --- a/cmd/serve.go +++ b/cmd/serve.go @@ -79,7 +79,7 @@ func (s *ServeCmd) Run(ctx *Context) error { case "block": defer profile.Start(profile.BlockProfile, profilePath).Stop() default: - log.Fatal().Msgf("Unknown profiler: %s", s.Profiler) + log.Fatal().Msgf("Unknown profiler: %s", s.Profiler) //nolint:gocritic // defer not set if profiler is unknown } } diff --git a/internal/notif/apprise/client.go b/internal/notif/apprise/client.go index 0e1952dd..e79edcdd 100644 --- a/internal/notif/apprise/client.go +++ b/internal/notif/apprise/client.go @@ -87,11 +87,12 @@ func (c *Client) Send(entry model.NotifEntry) error { q := u.Query() u.RawQuery = q.Encode() - hc := http.Client{} - ctx, cancel := context.WithTimeout(context.Background(), *c.cfg.Timeout) - defer cancel() + cancelCtx, cancel := context.WithCancelCause(context.Background()) + timeoutCtx, _ := context.WithTimeoutCause(cancelCtx, *c.cfg.Timeout, errors.WithStack(context.DeadlineExceeded)) //nolint:govet // no need to manually cancel this context as we already rely on parent + defer func() { cancel(errors.WithStack(context.Canceled)) }() - req, err := http.NewRequestWithContext(ctx, "POST", u.String(), dataBuf) + hc := http.Client{} + req, err := http.NewRequestWithContext(timeoutCtx, "POST", u.String(), dataBuf) if err != nil { return err } diff --git a/internal/notif/discord/client.go b/internal/notif/discord/client.go index 5b5fd157..cad9ba9c 100644 --- a/internal/notif/discord/client.go +++ b/internal/notif/discord/client.go @@ -128,11 +128,12 @@ func (c *Client) Send(entry model.NotifEntry) error { return err } - hc := http.Client{} - ctx, cancel := context.WithTimeout(context.Background(), *c.cfg.Timeout) - defer cancel() + cancelCtx, cancel := context.WithCancelCause(context.Background()) + timeoutCtx, _ := context.WithTimeoutCause(cancelCtx, *c.cfg.Timeout, errors.WithStack(context.DeadlineExceeded)) //nolint:govet // no need to manually cancel this context as we already rely on parent + defer func() { cancel(errors.WithStack(context.Canceled)) }() - req, err := http.NewRequestWithContext(ctx, "POST", u.String(), dataBuf) + hc := http.Client{} + req, err := http.NewRequestWithContext(timeoutCtx, "POST", u.String(), dataBuf) if err != nil { return err } diff --git a/internal/notif/gotify/client.go b/internal/notif/gotify/client.go index de51bd07..c7c83020 100644 --- a/internal/notif/gotify/client.go +++ b/internal/notif/gotify/client.go @@ -89,11 +89,12 @@ func (c *Client) Send(entry model.NotifEntry) error { q.Set("token", token) u.RawQuery = q.Encode() - hc := http.Client{} - ctx, cancel := context.WithTimeout(context.Background(), *c.cfg.Timeout) - defer cancel() + cancelCtx, cancel := context.WithCancelCause(context.Background()) + timeoutCtx, _ := context.WithTimeoutCause(cancelCtx, *c.cfg.Timeout, errors.WithStack(context.DeadlineExceeded)) //nolint:govet // no need to manually cancel this context as we already rely on parent + defer func() { cancel(errors.WithStack(context.Canceled)) }() - req, err := http.NewRequestWithContext(ctx, "POST", u.String(), bytes.NewBuffer(jsonBody)) + hc := http.Client{} + req, err := http.NewRequestWithContext(timeoutCtx, "POST", u.String(), bytes.NewBuffer(jsonBody)) if err != nil { return err } diff --git a/internal/notif/ntfy/client.go b/internal/notif/ntfy/client.go index dc26f64a..39182dde 100644 --- a/internal/notif/ntfy/client.go +++ b/internal/notif/ntfy/client.go @@ -81,11 +81,12 @@ func (c *Client) Send(entry model.NotifEntry) error { q := u.Query() u.RawQuery = q.Encode() - hc := http.Client{} - ctx, cancel := context.WithTimeout(context.Background(), *c.cfg.Timeout) - defer cancel() + cancelCtx, cancel := context.WithCancelCause(context.Background()) + timeoutCtx, _ := context.WithTimeoutCause(cancelCtx, *c.cfg.Timeout, errors.WithStack(context.DeadlineExceeded)) //nolint:govet // no need to manually cancel this context as we already rely on parent + defer func() { cancel(errors.WithStack(context.Canceled)) }() - req, err := http.NewRequestWithContext(ctx, "POST", u.String(), dataBuf) + hc := http.Client{} + req, err := http.NewRequestWithContext(timeoutCtx, "POST", u.String(), dataBuf) if err != nil { return err } diff --git a/internal/notif/rocketchat/client.go b/internal/notif/rocketchat/client.go index cb20e94e..b0264834 100644 --- a/internal/notif/rocketchat/client.go +++ b/internal/notif/rocketchat/client.go @@ -122,11 +122,12 @@ func (c *Client) Send(entry model.NotifEntry) error { } u.Path = path.Join(u.Path, "api/v1/chat.postMessage") - hc := http.Client{} - ctx, cancel := context.WithTimeout(context.Background(), *c.cfg.Timeout) - defer cancel() + cancelCtx, cancel := context.WithCancelCause(context.Background()) + timeoutCtx, _ := context.WithTimeoutCause(cancelCtx, *c.cfg.Timeout, errors.WithStack(context.DeadlineExceeded)) //nolint:govet // no need to manually cancel this context as we already rely on parent + defer func() { cancel(errors.WithStack(context.Canceled)) }() - req, err := http.NewRequestWithContext(ctx, "POST", u.String(), dataBuf) + hc := http.Client{} + req, err := http.NewRequestWithContext(timeoutCtx, "POST", u.String(), dataBuf) if err != nil { return err } diff --git a/internal/notif/signalrest/client.go b/internal/notif/signalrest/client.go index c1b37f74..0da3317b 100644 --- a/internal/notif/signalrest/client.go +++ b/internal/notif/signalrest/client.go @@ -9,6 +9,7 @@ import ( "github.com/crazy-max/diun/v4/internal/model" "github.com/crazy-max/diun/v4/internal/msg" "github.com/crazy-max/diun/v4/internal/notif/notifier" + "github.com/pkg/errors" ) // Client represents an active signalrest notification object @@ -62,11 +63,12 @@ func (c *Client) Send(entry model.NotifEntry) error { return err } - hc := http.Client{} - ctx, cancel := context.WithTimeout(context.Background(), *c.cfg.Timeout) - defer cancel() + cancelCtx, cancel := context.WithCancelCause(context.Background()) + timeoutCtx, _ := context.WithTimeoutCause(cancelCtx, *c.cfg.Timeout, errors.WithStack(context.DeadlineExceeded)) //nolint:govet // no need to manually cancel this context as we already rely on parent + defer func() { cancel(errors.WithStack(context.Canceled)) }() - req, err := http.NewRequestWithContext(ctx, "POST", c.cfg.Endpoint, bytes.NewBuffer(body)) + hc := http.Client{} + req, err := http.NewRequestWithContext(timeoutCtx, "POST", c.cfg.Endpoint, bytes.NewBuffer(body)) if err != nil { return err } diff --git a/internal/notif/teams/client.go b/internal/notif/teams/client.go index 200bbec0..b1b776df 100644 --- a/internal/notif/teams/client.go +++ b/internal/notif/teams/client.go @@ -110,11 +110,12 @@ func (c *Client) Send(entry model.NotifEntry) error { return err } - hc := http.Client{} - ctx, cancel := context.WithTimeout(context.Background(), time.Duration(10)*time.Second) - defer cancel() + cancelCtx, cancel := context.WithCancelCause(context.Background()) + timeoutCtx, _ := context.WithTimeoutCause(cancelCtx, 10*time.Second, errors.WithStack(context.DeadlineExceeded)) //nolint:govet // no need to manually cancel this context as we already rely on parent + defer func() { cancel(errors.WithStack(context.Canceled)) }() - req, err := http.NewRequestWithContext(ctx, "POST", webhookURL, bytes.NewBuffer(jsonBody)) + hc := http.Client{} + req, err := http.NewRequestWithContext(timeoutCtx, "POST", webhookURL, bytes.NewBuffer(jsonBody)) if err != nil { return err } diff --git a/internal/notif/webhook/client.go b/internal/notif/webhook/client.go index c6b4de13..56853e80 100644 --- a/internal/notif/webhook/client.go +++ b/internal/notif/webhook/client.go @@ -8,6 +8,7 @@ import ( "github.com/crazy-max/diun/v4/internal/model" "github.com/crazy-max/diun/v4/internal/msg" "github.com/crazy-max/diun/v4/internal/notif/notifier" + "github.com/pkg/errors" ) // Client represents an active webhook notification object @@ -47,11 +48,12 @@ func (c *Client) Send(entry model.NotifEntry) error { return err } - hc := http.Client{} - ctx, cancel := context.WithTimeout(context.Background(), *c.cfg.Timeout) - defer cancel() + cancelCtx, cancel := context.WithCancelCause(context.Background()) + timeoutCtx, _ := context.WithTimeoutCause(cancelCtx, *c.cfg.Timeout, errors.WithStack(context.DeadlineExceeded)) //nolint:govet // no need to manually cancel this context as we already rely on parent + defer func() { cancel(errors.WithStack(context.Canceled)) }() - req, err := http.NewRequestWithContext(ctx, "POST", c.cfg.Endpoint, bytes.NewBuffer(body)) + hc := http.Client{} + req, err := http.NewRequestWithContext(timeoutCtx, "POST", c.cfg.Endpoint, bytes.NewBuffer(body)) if err != nil { return err } diff --git a/pkg/k8s/client.go b/pkg/k8s/client.go index 538f1b20..dbd2ef51 100644 --- a/pkg/k8s/client.go +++ b/pkg/k8s/client.go @@ -68,7 +68,7 @@ func newInClusterClient(opts Options) (*kubernetes.Clientset, error) { config.Host = opts.Endpoint } if opts.TLSInsecure != nil { - config.TLSClientConfig.Insecure = *opts.TLSInsecure + config.Insecure = *opts.TLSInsecure } return kubernetes.NewForConfig(config) @@ -80,7 +80,7 @@ func newExternalClusterClientFromFile(opts Options, file string) (*kubernetes.Cl return nil, err } if opts.TLSInsecure != nil { - configFromFlags.TLSClientConfig.Insecure = *opts.TLSInsecure + configFromFlags.Insecure = *opts.TLSInsecure } return kubernetes.NewForConfig(configFromFlags) @@ -113,7 +113,7 @@ func newExternalClusterClient(opts Options) (*kubernetes.Clientset, error) { } } if opts.TLSInsecure != nil { - config.TLSClientConfig.Insecure = *opts.TLSInsecure + config.Insecure = *opts.TLSInsecure } return kubernetes.NewForConfig(config) diff --git a/pkg/registry/registry.go b/pkg/registry/registry.go index 30a7f01b..dc1f4f36 100644 --- a/pkg/registry/registry.go +++ b/pkg/registry/registry.go @@ -5,6 +5,7 @@ import ( "time" "github.com/containers/image/v5/types" + "github.com/pkg/errors" ) // Client represents an active docker registry object @@ -43,9 +44,11 @@ func New(opts Options) (*Client, error) { func (c *Client) timeoutContext() (context.Context, context.CancelFunc) { ctx := context.Background() - var cancel context.CancelFunc = func() {} + var cancelFunc context.CancelFunc = func() {} if c.opts.Timeout > 0 { - ctx, cancel = context.WithTimeout(ctx, c.opts.Timeout) + cancelCtx, cancel := context.WithCancelCause(ctx) + ctx, _ = context.WithTimeoutCause(cancelCtx, c.opts.Timeout, errors.WithStack(context.DeadlineExceeded)) //nolint:govet // no need to manually cancel this context as we already rely on parent + cancelFunc = func() { cancel(errors.WithStack(context.Canceled)) } } - return ctx, cancel + return ctx, cancelFunc }