internal/config/change_handler.go (35 lines of code) (raw):
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
// Package config contains the operator's runtime configuration.
package config
import (
"sync"
"github.com/go-logr/logr"
logf "sigs.k8s.io/controller-runtime/pkg/log"
)
// changeHandler is implemented by any structure that is able to register callbacks
// and call them using one single method.
type changeHandler interface {
// Do will call every registered callback.
Do() error
// Register this function as a callback that will be executed when Do() is called.
Register(f func() error)
}
// newOnChange returns a thread-safe ChangeHandler.
func newOnChange() changeHandler {
return &onChange{
logger: logf.Log.WithName("change-handler"),
}
}
type onChange struct {
logger logr.Logger
callbacks []func() error
muCallbacks sync.Mutex
}
func (o *onChange) Do() error {
o.muCallbacks.Lock()
defer o.muCallbacks.Unlock()
for _, fn := range o.callbacks {
if err := fn(); err != nil {
o.logger.Error(err, "change callback failed")
}
}
return nil
}
func (o *onChange) Register(f func() error) {
o.muCallbacks.Lock()
defer o.muCallbacks.Unlock()
o.callbacks = append(o.callbacks, f)
}