internal/pkg/rollback/rollback.go (37 lines of code) (raw):
// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
// or more contributor license agreements. Licensed under the Elastic License;
// you may not use this file except in compliance with the Elastic License.
// Package rollback provides callback function registration that can be used to trigger a rollback.
package rollback
import (
"context"
"github.com/rs/zerolog"
)
// RollbackFunc is a function that is called in order to perform a rollback.
type RollbackFunc func(ctx context.Context) error
type rollbackInfo struct {
name string
fn RollbackFunc
}
// Rollback is used to track RollbackFuncs.
type Rollback struct {
log zerolog.Logger
rbi []rollbackInfo
}
// New returns a new Rollback.
func New(log zerolog.Logger) *Rollback {
return &Rollback{
log: log,
}
}
// Register adds the named function to Rollback.
func (r *Rollback) Register(name string, fn RollbackFunc) {
r.rbi = append(r.rbi, rollbackInfo{name, fn})
}
// Rollback execute all rollback functions, log errors, and return the first error afterwards.
func (r *Rollback) Rollback(ctx context.Context) (err error) {
for _, rb := range r.rbi {
log := r.log.With().Str("rollback_fn_name", rb.name).Logger()
log.Debug().Msg("rollback function called")
if rerr := rb.fn(ctx); rerr != nil {
log.Error().Err(rerr).Msgf("rollback function %q failed", rb.name)
if err == nil {
err = rerr
}
} else {
log.Debug().Msgf("rollback function %q succeeded", rb.name)
}
}
return //nolint:nakedret // short function
}