Skip to content

Commit

Permalink
fix(*): rely only on callbacks to decide which config to write (#79)
Browse files Browse the repository at this point in the history
  • Loading branch information
jlevesy authored Oct 1, 2024
1 parent b3a4bb0 commit 01afc6f
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 43 deletions.
10 changes: 4 additions & 6 deletions cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ func run() int {

reconciller := config.NewReconciller(cfg.configPath, cfg.outputPath)

if err := reconciller.Reconcile(ctx); err != nil {
if err := reconciller.Reconcile(ctx, false); err != nil {
klog.ErrorS(err, "Can't perform an initial sync")
return 1
}
Expand Down Expand Up @@ -113,7 +113,7 @@ func run() int {
OnStartedLeading: func(ctx context.Context) {
klog.Info("Leading, applying leader configuration.")

if err := reconciller.Reconcile(ctx); err != nil {
if err := reconciller.Reconcile(ctx, true); err != nil {
klog.ErrorS(err, "Failed to reconcile configurations")
return
}
Expand All @@ -126,7 +126,7 @@ func run() int {
OnStoppedLeading: func() {
klog.Info("Stopped leading, applying follower configuration.")

if err := reconciller.Reconcile(ctx); err != nil {
if err := reconciller.Reconcile(ctx, false); err != nil {
klog.ErrorS(err, "Failed to reconcile configurations")
return
}
Expand Down Expand Up @@ -158,9 +158,7 @@ func run() int {
klog.Info("Graceful shutdown, left the election")
}()

reconciller.SetLeaderChecker(elector.Status())

watcher, err := watcher.New(filepath.Dir(cfg.configPath), reconciller, notifier)
watcher, err := watcher.New(filepath.Dir(cfg.configPath), reconciller, notifier, elector.Status())
if err != nil {
klog.ErrorS(err, "Can't create the watcher")
return 1
Expand Down
13 changes: 2 additions & 11 deletions config/reconcile.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,11 @@ import (
"context"

"github.com/imdario/mergo"
"github.com/jlevesy/prometheus-elector/election"
"k8s.io/klog/v2"
)

type Reconciler struct {
sourcePath string
outputPath string

leaderChecker election.LeaderChecker
}

func NewReconciller(src, out string) *Reconciler {
Expand All @@ -22,20 +18,15 @@ func NewReconciller(src, out string) *Reconciler {
}
}

func (r *Reconciler) SetLeaderChecker(lc election.LeaderChecker) {
r.leaderChecker = lc
}

func (r *Reconciler) Reconcile(ctx context.Context) error {
func (r *Reconciler) Reconcile(ctx context.Context, leader bool) error {
cfg, err := loadConfiguration(r.sourcePath)
if err != nil {
return err
}

targetCfg := cfg.Follower

if cfg.Leader != nil && r.leaderChecker != nil && r.leaderChecker.IsLeader() {
klog.Info("Writing leader configuration")
if leader {
if err := mergo.Merge(
&targetCfg,
cfg.Leader,
Expand Down
21 changes: 4 additions & 17 deletions config/reconcile_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import (
"testing"

"github.com/jlevesy/prometheus-elector/config"
"github.com/jlevesy/prometheus-elector/election"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
Expand All @@ -18,27 +17,21 @@ const fileName = "prometheus.yaml"
func TestReconciler(t *testing.T) {
for _, testCase := range []struct {
desc string
leaderChecker election.LeaderChecker
isLeader bool
inputPath string
wantError error
wantResultPath string
}{
{
desc: "follower without leader checker",
inputPath: "./testdata/config.yaml",
leaderChecker: nil,
wantResultPath: "./testdata/follower_no_leader_result.yaml",
},
{
desc: "follower",
inputPath: "./testdata/config.yaml",
leaderChecker: leaderCheckerFunc(func() bool { return false }),
isLeader: false,
wantResultPath: "./testdata/follower_no_leader_result.yaml",
},
{
desc: "leader",
inputPath: "./testdata/config.yaml",
leaderChecker: leaderCheckerFunc(func() bool { return true }),
isLeader: true,
wantResultPath: "./testdata/leader_result.yaml",
},
{
Expand All @@ -63,9 +56,7 @@ func TestReconciler(t *testing.T) {
)
)

reconciler.SetLeaderChecker(testCase.leaderChecker)

err := reconciler.Reconcile(ctx)
err := reconciler.Reconcile(ctx, testCase.isLeader)
if testCase.wantError != nil {
assert.Equal(t, testCase.wantError, err)
return
Expand All @@ -82,7 +73,3 @@ func TestReconciler(t *testing.T) {
})
}
}

type leaderCheckerFunc func() bool

func (l leaderCheckerFunc) IsLeader() bool { return l() }
19 changes: 11 additions & 8 deletions watcher/watcher.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,18 @@ import (
"k8s.io/klog/v2"

"github.com/jlevesy/prometheus-elector/config"
"github.com/jlevesy/prometheus-elector/election"
"github.com/jlevesy/prometheus-elector/notifier"
)

type FileWatcher struct {
fsWatcher *fsnotify.Watcher
reconciler *config.Reconciler
notifier notifier.Notifier
fsWatcher *fsnotify.Watcher
reconciler *config.Reconciler
leaderChecker election.LeaderChecker
notifier notifier.Notifier
}

func New(path string, reconciler *config.Reconciler, notifier notifier.Notifier) (*FileWatcher, error) {
func New(path string, reconciler *config.Reconciler, notifier notifier.Notifier, leaderChecker election.LeaderChecker) (*FileWatcher, error) {
watcher, err := fsnotify.NewWatcher()
if err != nil {
return nil, fmt.Errorf("unable to create fsnotify watcher: %w", err)
Expand All @@ -31,9 +33,10 @@ func New(path string, reconciler *config.Reconciler, notifier notifier.Notifier)
klog.InfoS("Watching config directory", "path", path)

return &FileWatcher{
fsWatcher: watcher,
reconciler: reconciler,
notifier: notifier,
fsWatcher: watcher,
leaderChecker: leaderChecker,
reconciler: reconciler,
notifier: notifier,
}, nil
}

Expand All @@ -56,7 +59,7 @@ func (f *FileWatcher) Watch(ctx context.Context) error {

klog.Info("Configuration changed, reconciling...")

if err := f.reconciler.Reconcile(ctx); err != nil {
if err := f.reconciler.Reconcile(ctx, f.leaderChecker.IsLeader()); err != nil {
klog.ErrorS(err, "Reconciler reported an error")
continue
}
Expand Down
6 changes: 5 additions & 1 deletion watcher/watcher_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ func TestFileWatcher(t *testing.T) {
err := simulateConfigmapWrite(dir, fileName, []byte(defaultConfig))
require.NoError(t, err)

watcher, err := watcher.New(dir, reconciler, notifierFunc(notifier))
watcher, err := watcher.New(dir, reconciler, notifierFunc(notifier), leaderCheckerFunc(func() bool { return false }))
require.NoError(t, err)

defer watcher.Close()
Expand Down Expand Up @@ -113,3 +113,7 @@ type notifierFunc func() error
func (n notifierFunc) Notify(context.Context) error {
return n()
}

type leaderCheckerFunc func() bool

func (l leaderCheckerFunc) IsLeader() bool { return l() }

0 comments on commit 01afc6f

Please sign in to comment.